package fr.maistre.champagne.model;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;


import fr.maistre.SystemeMarché.Implementation.ReferenceMarket;
import fr.maistre.SystemeMarché.Implementation.SimpleMarket;
import fr.maistre.SystemeMarché.Interface.Market;
import fr.maistre.SystemeMarché.Interface.MarketEventManager;
import fr.maistre.TestMarché.MarketableExemples;


public class Partie implements ChampagneEventGenerator,Serializable {

	private Date dateInitiale = new Date(2014, 1, 1);

	public Tour tourActuel;

	private JoueurChampagne joueur;

	private NiveauDeDifficulté niveauDeDifficulté;

	private Market marché;
	private int score = 0;
	private int nombreDeTourMax = 60;

	private List<Tour> toursPassé = new ArrayList<Tour>();

	public Partie(JoueurChampagne joueur, NiveauDeDifficulté niveauDeDifficulté) {
		super();
		this.joueur = joueur;
		this.niveauDeDifficulté = niveauDeDifficulté;
		this.marché= new SimpleMarket("France", 60000000.0, 3500.0, 0.04, 0.1, 0.02857, 10000.0);
		this.remplirLeMarchédeMarketable();
		this.tourActuel = new Tour(joueur, marché, dateInitiale);
		
		Market marché = new SimpleMarket("France", 60000000.0, 3500.0, 0.25, 0.1, 0.35, 10000.0);
		
		remplirLeMarchédeMarketable();
	
	}

	private void remplirLeMarchédeMarketable() {
	
		MarketEventManager marché = new SimpleMarket("France", 60000000.0,
				3500.0, 0.25,
				0.1, 0.35, 10000.0);

		ReferenceMarket referenceMarketVigne = new ReferenceMarket(0.000002,
				10000.0, 1, 10000.0, 14870.0, 38905.83, 34394.97);
		marché.setReferenceMarket(MarketableExemples.VIGNE,
				referenceMarketVigne);

		ReferenceMarket referenceMarketB = new ReferenceMarket(0.0001, 0, 2000,
				7.44, 2.05, 12839012.34, 24309317.72);
		referenceMarketB.addInfrastructure(MarketableExemples.VIGNE, 0.005);
		marché.setReferenceMarket(MarketableExemples.RAISIN, referenceMarketB);

		ReferenceMarket referenceMarketC = new ReferenceMarket(0.0002, 1.98,
				2000, 1500.0, 5.85, 449944041.97, 660698721.08);
		referenceMarketC.addMatierePremiere(MarketableExemples.RAISIN, 1);
		marché.setReferenceMarket(MarketableExemples.CRU_NORMAL,
				referenceMarketC);

		ReferenceMarket referenceMarketCruC = new ReferenceMarket(0.00002,
				1.98, 2000, 2000.0, 10.5, 449944041.97, 660698721.08);
		referenceMarketCruC.addMatierePremiere(MarketableExemples.RAISIN, 3);
		marché.setReferenceMarket(MarketableExemples.CRU_EXELENT,
				referenceMarketCruC);
	}

	public void tourSuivant() {

		tourActuel.executerLeTour();
		Tour tourSuivant = new Tour(joueur, marché, dateInitiale);
		score += tourActuel.getScore();
		toursPassé.add(tourActuel);
		// affichage resultats
		if (toursPassé.size() <= nombreDeTourMax) {
			toursPassé.add(tourActuel);
			tourActuel = tourSuivant;
			
		} else {
			// fin de la partie affichage des resultats
		}
	}

	public JoueurChampagne getJoueur() {
		return joueur;
	}

	public NiveauDeDifficulté getNiveauDeDifficulté() {
		return niveauDeDifficulté;
	}

	public Tour getTourActuel() {
		return tourActuel;
	}

	@Override
	public String toString() {
		return "Partie [dateInitiale=" + dateInitiale + ", tourActuel="
				+ tourActuel + ", joueur=" + joueur + ", niveauDeDifficulté="
				+ niveauDeDifficulté + ", marché=" + marché + ", score="
				+ score + ", nombreDeTourMax=" + nombreDeTourMax
				+ ", toursPassé=" + toursPassé + "]";
	}
	
	

}
